name: publish cli.js
env:
  DEBUG: napi:*
  APP_NAME: cli
  MACOSX_DEPLOYMENT_TARGET: '10.13'
on:
  workflow_dispatch:
  repository_dispatch:
    types: [publish-clijs]

defaults:
  run:
    working-directory: tooling/cli/node/

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: macos-latest
            target: x86_64-apple-darwin
            architecture: x64
            build: |
              yarn build:release
              strip -x *.node
          - host: windows-latest
            build: yarn build:release
            target: x86_64-pc-windows-msvc
            architecture: x64
          - host: windows-latest
            build: yarn build:release --target i686-pc-windows-msvc
            target: i686-pc-windows-msvc
            architecture: x64
          - host: ubuntu-18.04
            target: x86_64-unknown-linux-gnu
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
            build: |
              cd tooling/cli/node
              yarn build:release --target x86_64-unknown-linux-gnu
              strip *.node
          - host: ubuntu-18.04
            target: x86_64-unknown-linux-musl
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
            build: |
              cd tooling/cli/node
              yarn build:release
              strip *.node
          - host: macos-latest
            target: aarch64-apple-darwin
            build: |
              yarn build:release --target=aarch64-apple-darwin
              strip -x *.node
          - host: ubuntu-18.04
            target: aarch64-unknown-linux-gnu
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
            build: |
              cd tooling/cli/node
              yarn build:release --target aarch64-unknown-linux-gnu
              aarch64-unknown-linux-gnu-strip *.node
          - host: ubuntu-18.04
            architecture: x64
            target: armv7-unknown-linux-gnueabihf
            setup: |
              sudo apt-get update
              sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
            build: |
              yarn build:release --target=armv7-unknown-linux-gnueabihf
              arm-linux-gnueabihf-strip *.node
          - host: ubuntu-18.04
            architecture: x64
            target: aarch64-unknown-linux-musl
            docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
            build: |
              cd tooling/cli/node
              rustup target add aarch64-unknown-linux-musl
              yarn build:release --target aarch64-unknown-linux-musl
              /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node
          #- host: windows-latest
          #  architecture: x64
          #  target: aarch64-pc-windows-msvc
          #  build: yarn build:release --target aarch64-pc-windows-msvc
    name: stable - ${{ matrix.settings.target }} - node@16
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        if: ${{ !matrix.settings.docker }}
        with:
          node-version: 16
          check-latest: true
          cache: yarn
          cache-dependency-path: 'tooling/cli/node/yarn.lock'
          architecture: ${{ matrix.settings.architecture }}
      - name: Install
        uses: actions-rs/toolchain@v1
        if: ${{ !matrix.settings.docker }}
        with:
          profile: minimal
          override: true
          toolchain: stable
          target: ${{ matrix.settings.target }}
      - uses: Swatinem/rust-cache@v1
        with:
          key: ${{ matrix.settings.target }}
          working-directory: 'tooling/cli/'
        if: ${{ matrix.settings.docker }}
      - name: Setup toolchain
        run: ${{ matrix.settings.setup }}
        if: ${{ matrix.settings.setup }}
        shell: bash
      - name: Install dependencies
        run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000

      - name: Build in docker
        uses: addnab/docker-run-action@v3
        if: ${{ matrix.settings.docker }}
        with:
          image: ${{ matrix.settings.docker }}
          options: --user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/root/.cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/root/.cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/root/.cargo/registry/index -v ${{ github.workspace }}:/build -w /build
          run: ${{ matrix.settings.build }}

      - name: Build
        run: ${{ matrix.settings.build }}
        if: ${{ !matrix.settings.docker }}
        shell: bash

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: bindings-${{ matrix.settings.target }}
          path: tooling/cli/node/${{ env.APP_NAME }}.*.node
          if-no-files-found: error
  #  build-freebsd:
  #    runs-on: macos-10.15
  #    name: Build FreeBSD
  #    steps:
  #      - uses: actions/checkout@v3
  #      - name: Build
  #        id: build
  #        uses: vmactions/freebsd-vm@v0.1.6
  #        env:
  #          DEBUG: napi:*
  #          RUSTUP_HOME: /usr/local/rustup
  #          CARGO_HOME: /usr/local/cargo
  #          RUSTUP_IO_THREADS: 1
  #        with:
  #          envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS
  #          usesh: true
  #          mem: 3000
  #          prepare: |
  #            pkg install -y curl node14 python2
  #            curl -qL https://www.npmjs.com/install.sh | sh
  #            npm install -g yarn
  #            curl https://sh.rustup.rs -sSf --output rustup.sh
  #            sh rustup.sh -y --profile minimal --default-toolchain stable
  #            export PATH="/usr/local/cargo/bin:$PATH"
  #            echo "~~~~ rustc --version ~~~~"
  #            rustc --version
  #            echo "~~~~ node -v ~~~~"
  #            node -v
  #            echo "~~~~ yarn --version ~~~~"
  #            yarn --version
  #          run: |
  #            export PATH="/usr/local/cargo/bin:$PATH"
  #            pwd
  #            ls -lah
  #            whoami
  #            env
  #            freebsd-version
  #            cd ./tooling/cli/node/
  #            yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
  #            yarn build:release
  #            strip -x *.node
  #            rm -rf node_modules
  #            rm -rf ../target
  #      - name: Upload artifact
  #        uses: actions/upload-artifact@v3
  #        with:
  #          name: bindings-freebsd
  #          path: tooling/cli/node/${{ env.APP_NAME }}.*.node
  #          if-no-files-found: error
  test-macOS-windows-binding:
    name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: macos-latest
            target: 'x86_64-apple-darwin'
          - host: windows-latest
            target: x86_64-pc-windows-msvc
        node:
          - '12'
          - '14'
          - '16'
          - '18'
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
          check-latest: true
          cache: yarn
          cache-dependency-path: 'tooling/cli/node/yarn.lock'
      - name: Install dependencies
        run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: bindings-${{ matrix.settings.target }}
          path: 'tooling/cli/node/'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Test bindings
        run: yarn test
  test-linux-x64-gnu-binding:
    name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '12'
          - '14'
          - '16'
          - '18'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
          check-latest: true
          cache: yarn
          cache-dependency-path: 'tooling/cli/node/yarn.lock'
      - name: Install dependencies
        run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: bindings-x86_64-unknown-linux-gnu
          path: 'tooling/cli/node/'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: install system dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libayatana-appindicator3-dev librsvg2-dev patchelf
      - name: Test bindings
        run: yarn test
  test-linux-x64-musl-binding:
    name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '12'
          - '14'
          - '16'
          - '18'
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
    steps:
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
          check-latest: true
          cache: yarn
          cache-dependency-path: 'tooling/cli/node/yarn.lock'
      - name: Install dependencies
        run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: bindings-x86_64-unknown-linux-musl
          path: 'tooling/cli/node/'
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Install system dependencies
        run: |
          apk add openssl-dev musl-dev glib-dev cairo-dev pkgconfig gdk-pixbuf-dev webkit2gtk-dev curl libappindicator-dev patchelf librsvg-dev gtk+3.0-dev
      - name: Setup and run tests
        run: |
          yarn tauri --help
          ls -la
      # TODO: fix this test: https://github.com/tauri-apps/tauri/runs/5145729140?check_suite_focus=true#step:9:704
      #- name: Setup and run tests
      #  run: |
      #    rustup install stable
      #    rustup default stable
      #    yarn test
      #    ls -la
  test-linux-arm-bindings:
    name: Test bindings on ${{ matrix.image }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        node:
          - '12'
          - '14'
          - '16'
          - '18'
        image:
          - ghcr.io/napi-rs/napi-rs/nodejs:aarch64-16
          - ghcr.io/napi-rs/napi-rs/nodejs:armhf-16
    runs-on: ubuntu-latest
    steps:
      - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
        working-directory: ${{ github.workspace }}
      - uses: actions/checkout@v3
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Install dependencies
        run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
      - name: Download aarch64-gnu artifacts
        uses: actions/download-artifact@v3
        with:
          name: bindings-aarch64-unknown-linux-gnu
          path: 'tooling/cli/node/'
      - name: Download armv7-gnueabihf artifacts
        uses: actions/download-artifact@v3
        with:
          name: bindings-armv7-unknown-linux-gnueabihf
          path: 'tooling/cli/node/'
      # TODO: actually run test, blocked by https://github.com/rust-lang/cargo/issues/8719
      - uses: addnab/docker-run-action@v3
        with:
          image: ${{ matrix.image }}
          options: '-v ${{ github.workspace }}:/build -w /build -e RUSTUP_HOME=/usr/local/rustup -e CARGO_HOME=/usr/local/cargo'
          shell: bash
          run: |
            set -e
            export PATH=/usr/local/cargo/bin/:/usr/local/fnm:$PATH
            apt-get update
            DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install --no-install-recommends -y unzip libgtk-3-dev webkit2gtk-4.0 libayatana-appindicator3-dev librsvg2-dev patchelf
            bash
            curl https://sh.rustup.rs -sSf | bash -s -- -y
            curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "/usr/local/fnm" --skip-shell
            eval "$(fnm env --use-on-cd)"
            fnm install ${{ matrix.node }}
            fnm use ${{ matrix.node }}
            cd tooling/cli/node
            yarn tauri --help
            ls -la
  publish:
    name: Publish
    runs-on: ubuntu-latest
    needs:
      #- build-freebsd
      - test-macOS-windows-binding
      - test-linux-x64-gnu-binding
      - test-linux-x64-musl-binding
      #- test-linux-arm-bindings
    steps:
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 16
          check-latest: true
          cache: yarn
          cache-dependency-path: 'tooling/cli/node/yarn.lock'
      - name: Install dependencies
        run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
      - name: Download all artifacts
        uses: actions/download-artifact@v3
        with:
          path: tooling/cli/node/artifacts
      - name: Move artifacts
        run: yarn artifacts
      - name: List packages
        run: ls -R ./npm
        shell: bash
      - name: Publish
        run: |
          echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
          npm publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
